﻿using OT.HikiSecureCenterApis.Req;
using OT.HikiSecureCenterApis.Res;
using OT.HikiSecureCenterApis.Service.OneCard.Res;

namespace OT.HikiSecureCenterApis.Service.OneCard
{
    /// <summary>
    /// 一卡通应用服务 --> 食堂消费
    /// </summary>
    public partial class OneCardService
    {
        #region 食堂消费资源
        /// <summary>
        /// 查询消费设备列表 /api/resource/v1/ccsDevice/search
        /// 根据条件查询目录下有权限的消费设备列表
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResCCSDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResCCSDevice>>?> CCSDeviceSearchAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResCCSDevice>>("/api/resource/v1/ccsDevice/search", 1.5, req);
        /// <summary>
        /// 增量获取消费设备数据 /api/resource/v1/ccsDevice/timeRange
        /// 根据资源类型、时间段增量获取资源，包含已删除数据。资源密码以*代替，其中开始日期与结束日期的时间差必须在1-48小时内。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="page">必填，页码、页大小、开始时间、结束时间</param>
        /// <returns><see cref="ResCCSDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResCCSDevice>>?> CCSDeviceTimeRangeAsync(ReqPageDate page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResCCSDevice>>("/api/resource/v1/ccsDevice/timeRange", 1.5, page);
        #endregion

        #region 食堂消费能力
        /// <summary>
        /// 查询账户余额 /api/cems/v1/account/balance/search
        /// 该接口可以通过卡号或人员唯一ID查询账户余额信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="personId">非必填，人员唯一Id， personId 和 cardNo 只要填一个即可，都填的话，以personId为准。可以通过获取人员列表v2接口获取</param>
        /// <param name="cardNo">非必填，卡号， personId 和 cardNo 只要填一个即可，都填的话，以personId为准可以通过获取卡片列表接口获取</param>
        /// <returns><see cref="ResAccountBalance"/></returns>
        public async Task<ResParameter<ResAccountBalance>?> AccountBalanceAsync(string personId = null, string cardNo = null) =>
          await SecureCenterApis.PostAsync<ResAccountBalance>("/api/cems/v1/account/balance/search", 1.3, new
          {
              personId = personId,
              cardNo = cardNo
          });
        /// <summary>
        /// 查询消费记录 /api/cems/v1/consume/log/search
        /// 该接口可以查询人员消费的记录，支持按照人员唯一标示、卡号、消费模式、上报时间段查询人员消费记录信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="page">必填，页码、页大小、开始时间、结束时间</param>
        /// <param name="personId">非必填，人员唯一ID， 获取人员列表v2 接口获取</param>
        /// <param name="cardNo">非必填，人员卡号， 获取卡片列表接口可以获取</param>
        /// <param name="chargeTypes">非必填，消费模式：1：计次模式 3：金额模式 多个用“,”隔开</param>
        /// <returns><see cref="ResLog"/></returns>
        public async Task<ResParameter<ResTurnPage<ResLog>>?> ConsumeLogSearchAsync(ReqPageDate page, string personId = null, string cardNo = null, string chargeTypes = null) =>
          await SecureCenterApis.PostAsync<ResTurnPage<ResLog>>("/api/cems/v1/consume/log/search", 1.3, new
          {
              startTime = page?.startTime,
              endTime = page?.endTime,
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10,
              chargeTypes = chargeTypes,
              personId = personId,
              cardNo = cardNo
          });
        /// <summary>
        /// 查询账户记录 /api/cems/v1/account/log/search
        /// 该接口可以查询人员账户的记录，支持按照人员唯一标示、交易类型、时间段查询人员账户记录信息
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="page">必填，页码、页大小、开始时间、结束时间</param>
        /// <param name="personId">非必填，人员唯一ID， 获取人员列表v2 接口获取</param>
        /// <param name="cardNo">非必填，人员卡号， 获取卡片列表接口可以获取</param>
        /// <param name="transactionTypes">非必填，账户交易类型：1：充值 2：退款 3：补贴 4：纠正 5：消费扣款 6：补贴账户清空 多个用“,”隔开</param>
        /// <returns><see cref="ResLog"/></returns>
        public async Task<ResParameter<ResTurnPage<ResLog>>?> AccountLogSearchAsync(ReqPageDate page, string personId = null, string cardNo = null,string transactionTypes = null) =>
          await SecureCenterApis.PostAsync<ResTurnPage<ResLog>>("/api/cems/v1/account/log/search", 1.3, new
          {
              startTime = page?.startTime,
              endTime = page?.endTime,
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10,
              transactionTypes = transactionTypes,
              personId = personId,
              cardNo = cardNo
          });
        /// <summary>
        /// 消费账户充值 /api/cems/v1/account/recharge
        /// 该接口可以通过账户类型、卡号或人员唯一ID对人员普通/补贴账户进行充值。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="money">必填，充值金额，单位：分，范围0 < money < 10000000</param>
        /// <param name="accountType">必填，账户类型,账户类型:1: 普通账户 2: 补贴账户</param>
        /// <param name="rechargeId">必填，充值唯一编号，重复编号只充值一次</param>
        /// <param name="personId">非必填，人员唯一ID卡号和人员唯一ID不可同时为空，如果人员Id和卡号同时不为空，按人员Id来充值,获取人员列表v2 接口获取</param>
        /// <param name="cardNo">非必填，卡号 卡号和人员唯一ID不可同时为空，获取卡片列表接口可以获取</param>
        /// <returns><see cref="ResAcsDevice"/></returns>
        public async Task<ResParameter<ResAccountBalance>?> AccountRechargeAsync(int money, int accountType,string rechargeId,string personId = null, string cardNo = null ) =>
          await SecureCenterApis.PostAsync<ResAccountBalance>("/api/cems/v1/account/recharge", 1.3, new {
              money = money,
              accountType = accountType,
              rechargeId = rechargeId,
              personId = personId,
              cardNo = cardNo
          });
        #endregion
    }
}
